package com.smartcommunity.dao.people;

import com.alibaba.fastjson.JSONObject;
import com.smartcommunity.entity.people.ExpressPeople;
import com.smartcommunity.entity.people.People;
import com.smartcommunity.entity.people.RealPeopleHouse;
import com.smartcommunity.entity.people.VidPeopleSense;
import com.smartcommunity.entity.statistic.StatisticByTypeResp;
import com.smartcommunity.entity.village.SixStatisticsEntity;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
/**
 * @ClassName: PeopleDao
 * @Description: 人员接口
 * @author: minsheng
 * @Date: 2019/1/3 13:34
 * @Company:
 * @version V1.5.0
 */
@Component
public interface PeopleDao {

	Integer getAllPeopleCount(Map<String,Object> queryMap);
	/**
	 * 单表查询所有人员，不带权限
	 * @param queryMap
	 * @return
     */
	List<People> getAllPeople(Map<String,Object> queryMap);

	/**
	 * 实口人员列表
	 * @param  people
	 * @return
	 */
	List<People> listPeoples(People people);
	int listPeoplesCount(People people);

	/**
	 * APP实口人员列表
	 * @param  people
	 * @return
	 */
	List<People> appListPeoples(People people);

	/**
	 * @Description: 根据条件查询
	 * @param: paramMap
	 * @return: List<People>
	 * @author: minsheng
	 * @date: 2019/1/15 10:42
	 */
	List<People> listPeoplesByParam(Map<String, String> paramMap);

	/**
	 * 人员分类数量
	 * @param paramMap
	 * @return
	 */
	Map<String,Long> peopleTypeCount(Map<String, Object> paramMap);

	List<SixStatisticsEntity> peopleTypeCountGroupByVillage();
	/**
	 * 获得所有的人员标签
	 * @return
	 */
	String getAllLabel();

	/**
	 * 人员标签数量
	 * @param paramMap
	 * @return
	 */
	Map<String,Long> peopleLabelCount(Map<String, String> paramMap);
	/**
	 * @Description: 根据条件查询人员信息
	 * @param: Map<String, String>
	 * @return: List<People>
	 * @author: minsheng
	 * @date: 2019/1/15 10:20
	 */
	List<People> listAllPeoples(Map<String, String> paramMap);

    /**
     * 人员数量
     *
     * @param people
     * @return
     */
    int countPeoples(People people);

	int countPeoplesByVillageCode(String villageCode);
	/**
	 * 获取人员基本信息
	 * @param map 查询条件
	 * @return 基本信息

    /**
     * 获取人员基本信息
     *
     * @param map 查询条件,查询条件不能为空。必须能定位到是哪个人。不然非常慢。
     * @return 基本信息
     */
    People getPeopleBaseInfo(Map<String, String> map);

    /**
     * @param paramMap
     * @return
     * @Title: queryPeopleById
     * @Description: 查询快递人员
     */
    List<ExpressPeople> listExpressPeoples(Map<String, String> paramMap);

	/**
	 * @Description: 按小区统计实有人口
	 * @param: Map<String, Object>
	 * @return: List<Map<String, Object>>
	 * @author: minsheng
	 * @date: 2019/1/4 13:11
	 */
	List<Map<String, Object>> listRealPeopleGroup(Map<String, Object> recordMap);

	/**
	 * 查询车辆
	 * @param paramMap
	 * @return
	 */
	Map<String,String> getVehicleByHouseNo(Map<String, String> paramMap);

	/**
	 * 查询所有人员信息
	 * @return
	 */
	List<People> queryPeople(Map<String, Object> param);
	/**
	 * @Description: 更新人口相关信息
	 * @param: Map<String, String>
	 * @return: void
	 * @author: minsheng
	 * @date: 2019/1/4 13:12
	 */
	void updatePeopleVillageCode(Map<String, String> paramMap);
	/**
	 * @Description: 更新人房关系
	 * @param: Map<String, String>
	 * @return: void
	 * @author: minsheng
	 * @date: 2019/1/4 13:12
	 */
	void updatePeopleHouse(Map<String, String> map);
	/**
	 * @Description: 新增人口
	 * @param: JSONObject
	 * @return: void
	 * @author: minsheng
	 * @date: 2019/1/4 13:12
	 */
    void insertPeople(JSONObject jsonObject);
	/**
	 * @Description: 新增人员标签
	 * @param: JSONObject
	 * @return: void
	 * @author: minsheng
	 * @date: 2019/1/4 13:12
	 */
    void insertPeopleLabelOne(JSONObject jsonObject);
	/**
	 * @Description: 删除人员
	 * @param: JSONObject
	 * @return: void
	 * @author: minsheng
	 * @date: 2019/1/4 13:12
	 */
	void deletePeople(List<String> credentialNos);

	/**
	 * @Description: 删除人房关系
	 * @param: JSONObject
	 * @return: void
	 */
	void deletePeopleHouse(List<String> credentialNos);

	/**
	 * 批量入库人员数据
	 * @param list 人员信息列表
	 */
	int insertPeoples(List<People> list);

	/**
	 * 更新人员证件照
	 * @param pathList 请求参数，包含证件号码idNo以及证件照地址picPath的映射map
	 */
	void updatePic(List<Map<String, Object>> pathList);

	/**
	 * 删除人员标签
	 * @param credentialNos
	 */
	void deletePeopleLabels(List<String> credentialNos);
	/**
	 * 更新人员信息
	 * @param people 人员实体对象
	 */
	void updatePeople(People people);

	/**
	 * 更新人员信息
	 * @param people 人员实体对象
	 */
	void updatePeoplePic(People people);

	/**
	 * 根据身份证号查询用户信息
	 * @param params
	 * @return
	 */
    int queryPeopleByCd(Map<String, Object> params);

	/**
	 * 根据身份证号查询用户人房关系
	 * @param map
	 * @return
	 */
	int queryPeopleHouse(Map<String, String> map);
	/**
	 * @Description: 根据小区编号和楼栋编号查询所有人员标签以及人房关系
	 * @param: Map<String, Object>
	 * @return: List<People>
	 * @author: minsheng
	 * @date: 2019/1/9 13:43
	 */
	List<People> getPeoplesLabelByBuildingNo(Map<String, Object> map);
	/**
	 * 插入人房关系信息
	 * @param house
	 */
	void insertRealPeopleHouse(RealPeopleHouse house);

	/**
	 * 插入已删除人员表
	 * @param jsonObject
	 */
	void insertPeopleDel(JSONObject jsonObject);

    /**
     * @Description: 获取实有房屋的人员信息
     * @param: Map<String, String>
     * @return: List<People>
     * @author: minsheng
     * @date: 2019/1/14 13:26
     */
    List<People> getPeoples(Map<String, String> map);

	/**
	 * 查询: 查询指定年龄段, 指定籍贯(或户籍地)的女性外来人员
	 * @param param
	 * @return
	 */
	List<String> queryMYPeopleExt(Map<String, Object> param);

	/**
	 * 查询: 根据身份证号查询对应人员的所有信息
	 * @param param ids
	 * @return
	 */
	List<People> queryPeopleAll(Map<String, Object> param);
    /**
     * @Description: 根据orgId统计人口数量
     * @param: ids
     * @return: int
     * @auther: minsheng
     * @date: 2019/3/1 13:52
     */
    int countPeopleByOrgId(Map<String, Object> param);

	/**
	 * 查询小区内所有的前科人员
	 * @param param
	 * @return
	 */
	List<People> listExCriminalByVillage(Map<String, Object> param);


	/**
	 * 获取查询用户VID
	 * @return
	 */
	List<People> getPeopleFeatureId(@Param("vids") List<String> vids);


	/**
	 * 根据vid查询身份证号
	 * @param vid
	 * @return
	 */
	String getPeopleCredentialNoByVid(@Param("vid")String vid);

	People queryPeopleBaseInfo(String credentialNo);

	People queryPeopleById(String id);


	/**
	 * 人员详细居住地址
	 */
	List<RealPeopleHouse> getPeopleDetailAddress(@Param("credentialNo")String credentialNo);

	List<Integer> getOrgId(Integer parentId);

	/**
	 * 统计实有人员相关数据
	 * @param params
	 * @return
	 */
	int countRealPeoples(Map<String, Object> params);

	List<VidPeopleSense> queryPeopleCount(Map<String, Object> params);


	/**
	 * 查询未同步到vid结构化引擎的人员信息
	 * @author 渔七
	 * @since 2023年1月7日
	 */
	List<People> queryUnSyncPeople(@Param("start") Integer start, @Param("size") Integer size);
	int queryUnSyncPeopleCount();

	/**
	 * 将同步到vid结构引擎的信息更新到人员信息表
	 * @author 渔七
	 * @since 2023年1月7日
	 */
	void updateUnSyncPeople(@Param("id") Integer id, @Param("featureId") Long featureId);

	/**
	 * 获取没有vid人员的证件
	 */
	List<String> getNoVidPeople(@Param("start") Integer start, @Param("size") Integer size);
	int getNoVidPeopleCount();

	List<Long> getFeatureIds(List<String> credentialNos);

	void updateVidByNo(List<Map<String,Object>> list);

	/**
	 * 通过标签查询身份证
	 * @param tagId 标签id，多个标签用逗号分隔
	 * @return 身份证列表
	 */
	List<String> getPeopleByTagId(@Param("tagId") String tagId);

    Integer countByTagGroup(@Param("villageCode") String villageCode, @Param("groupId") String groupId);

    List<People> getPeopleByName(@Param("peopleName") String peopleName);

	List<People> getPeopleByCredentialNo(@Param("credentialNos") List<String> credentialNos);

	/**
	 * 通过小区编码统计人员总数
	 * @param villageCodes 小区编码，多个以逗号分隔
	 * @return
	 */
	int getPeopleTotalCountByVillageCode(@Param("villageCodes") String villageCodes);

	/**
	 * 根据身份证修改featureId和vid
	 * @param credentialNo
	 * @param featureId
	 * @param vid
	 */
    void updatePeopleVidAndFeatureId(@Param("credentialNo")String credentialNo, @Param("featureId")Long featureId, @Param("vid")Long vid);

	List<StatisticByTypeResp> getPeopleTypeCount();
	
	/**
	 * 分页查询实有人口(es-basedata索引数据初始化用)
	 * @param people
	 * @return
	 */
	List<People> listPeoplesForEs(People people);
	
	Integer getAllPeopleCountForEs(@Param("villageCode") String villageCode, @Param("buildingNo") String buildingNo);

	List<People> queryPeopleByVillageCode(@Param("villageCode") String villageCode, @Param("buildingNo") String buildingNo, @Param("unitNo") String unitNo);

	List<People> queryPeopleByCredentialNo(@Param("credentialNo") String credentialNo, @Param("peopleId") String peopleId);
}
